/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package estructurassa.controladores.ordenesCompra;

import estructurassa.controladores.Controlador;
import estructurassa.controladores.ControladorPrincipal;
import estructurassa.controladores.FabricaControladores;
import estructurassa.controladores.Stock.ModeloTablaDetalleOrdenPedido;
import estructurassa.entidades.PedidoAProveedores;
import estructurassa.entidades.Proveedor;
import estructurassa.expertos.ExpertoABMPedidoAProveedores;
import estructurassa.expertos.FabricaExpertos;
import estructurassa.expertos.excepciones.ABMPedidoAProveedoresException;
import estructurassa.utiles.modeloTabla.ModeloTabla;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JInternalFrame;
import javax.swing.JOptionPane;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import newotcapp.modeloComboBox.ItemComboGenerico;
import newotcapp.modeloComboBox.ModeloComboGenerico;
import persistencia.exceptions.ExcepcionFachada;

/**
 *
 * @author diego
 */
public class ControladorOrdenCompra implements Controlador {

    private PantallaOrdenCompra pantalla;
    private ExpertoABMPedidoAProveedores experto;
    private boolean iniciado = false;
    private PedidoAProveedores ordenSeleccionada;
    private DetalleOrdenCompraJDialog detalleOrdenJDialog;

    public ControladorOrdenCompra() {
        pantalla = new PantallaOrdenCompra();
        experto = (ExpertoABMPedidoAProveedores) FabricaExpertos.getInstancia().getExperto(FabricaExpertos.expertos.ABM_PEDIDO_PROVEEDOR);

        detalleOrdenJDialog = new DetalleOrdenCompraJDialog(null, true);
        detalleOrdenJDialog.setLocationRelativeTo(null);

        pantalla.getTblOrdenes().setModel(new ModeloTablaOrdenesCompra());

        pantalla.getTblOrdenes().setAutoCreateRowSorter(true);
        pantalla.getTblOrdenes().getSelectionModel().addListSelectionListener(new ListSelectionListener() {
            @Override
            public void valueChanged(ListSelectionEvent e) {
                seleccionarOrden();
            }
        });
        pantalla.getTblOrdenes().addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                if (e.getClickCount() == 2) {
                    seleccionarOrden();
                    mostrarDetalleOrden();
                }
            }
        });
        pantalla.getBtnSalir().addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                salir();
            }
        });
        pantalla.getBtnConfirmarEnvio().addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                enviarOrden();
            }
        });
        /**
         * ###########################################################################################
         * ###########################################################################################
         * Jdialog Detalle ORden
         * ###########################################################################################
         * ###########################################################################################
         */
        detalleOrdenJDialog.getTblDetalleOrden().setModel(new ModeloTablaDetalleOrdenPedido());
        detalleOrdenJDialog.getCbxProveedor().setModel(new ModeloComboGenerico(null));
        detalleOrdenJDialog.getBtnAceptar().addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                detalleOrdenJDialog.setVisible(false);
                detalleOrdenJDialog.limpiarPantalla();
            }
        });
        detalleOrdenJDialog.getBtnCambiarProveedor().addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                cambiarProveedor();
            }
        });
    }

    @Override
    public JInternalFrame getPantalla() {
        return pantalla;
    }

    @Override
    public void iniciar() {
        if (!iniciado) {
            ((ControladorPrincipal) FabricaControladores.getInstance().getControlador(FabricaControladores.controladoresNombre.PRINCIPAL)).agregarPantallaInterna(pantalla);
            iniciado = true;
        }
        List pedidosPendientes = experto.buscarPedidosPendietnes();
        experto.calcularCostoYTiempoProveedor(pedidosPendientes);
        ((ModeloTabla) pantalla.getTblOrdenes().getModel()).setListaElementos(pedidosPendientes);
        pantalla.setVisible(true);
    }

    private void mostrarDetalleOrden() {
        if (ordenSeleccionada == null) {
            return;
        }
        detalleOrdenJDialog.getLblCosto().setText(String.valueOf(ordenSeleccionada.getCostoOrden()));
        detalleOrdenJDialog.getLblEstado().setText(ordenSeleccionada.getEstado().getNombre());
        detalleOrdenJDialog.getLblFecha().setText(ordenSeleccionada.getFecha().toString());
        List<ItemComboGenerico> listadoProv = new ArrayList<>();
        for (Proveedor proveedor : experto.buscarProveedoresCompatiblesPedido(ordenSeleccionada)) {
            listadoProv.add(proveedor);
        }
        ((ModeloComboGenerico) detalleOrdenJDialog.getCbxProveedor().getModel()).setListaElementos(listadoProv);
        ((ModeloComboGenerico) detalleOrdenJDialog.getCbxProveedor().getModel()).setItemSeleccionado(ordenSeleccionada.getProveedor());
        ((ModeloTabla) detalleOrdenJDialog.getTblDetalleOrden().getModel()).setListaElementos(ordenSeleccionada.getDetallesPedido());
        detalleOrdenJDialog.setVisible(true);
    }

    private void seleccionarOrden() {
        detalleOrdenJDialog.limpiarPantalla();
        int fila = pantalla.getTblOrdenes().getSelectedRow();
        if (fila == -1) {
            return;
        }
        int filaModelo = pantalla.getTblOrdenes().convertRowIndexToModel(fila);
        ordenSeleccionada = (PedidoAProveedores) ((ModeloTabla) pantalla.getTblOrdenes().getModel()).getRow(filaModelo);
    }

    private void cambiarProveedor() {
        Proveedor nuevoProv = (Proveedor) ((ModeloComboGenerico) detalleOrdenJDialog.getCbxProveedor().getModel()).getItemSeleccionado();
        try {
            experto.cambiarProveedorOrden(ordenSeleccionada, nuevoProv);
        } catch (ABMPedidoAProveedoresException ex) {
            JOptionPane.showMessageDialog(pantalla, ex.getMessage(), "INFORMACIÓN", JOptionPane.INFORMATION_MESSAGE);
        } catch (ExcepcionFachada ex) {
            JOptionPane.showMessageDialog(pantalla, ex.getMessage(), "ERROR", JOptionPane.ERROR_MESSAGE);
        }
        List pedidosPendientes = experto.buscarPedidosPendietnes();
        experto.calcularCostoYTiempoProveedor(pedidosPendientes);
        ((ModeloTabla) pantalla.getTblOrdenes().getModel()).setListaElementos(pedidosPendientes);
        detalleOrdenJDialog.setVisible(false);
    }

    private void salir() {
        pantalla.setVisible(false);
    }

    private void enviarOrden() {
        if (ordenSeleccionada == null) {
            return;
        }
        try {
            experto.EnviarOrdenPedido(ordenSeleccionada);
        } catch (ExcepcionFachada ex) {
            JOptionPane.showMessageDialog(pantalla, ex.getMessage(), "ERROR", JOptionPane.ERROR_MESSAGE);
        }
        JOptionPane.showMessageDialog(pantalla, "Orden Actualizada", "INFORMACIÓN", JOptionPane.INFORMATION_MESSAGE);
        List pedidosPendientes = experto.buscarPedidosPendietnes();
        experto.calcularCostoYTiempoProveedor(pedidosPendientes);
        ((ModeloTabla) pantalla.getTblOrdenes().getModel()).setListaElementos(pedidosPendientes);
    }
}
